﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Basicas;
using MySql.Data.MySqlClient;
using Basicas.Utils;
using System.Data; 

namespace ProjetoJornada_DAL.Repositorio
{
    public class RepFormaPagamento
    {

        private DAO dao;

        public RepFormaPagamento()
        {
            this.dao = DAO.Instance;
        }

        #region Metodos
        public int Inserir(FormaPagamento formaPagamento)
        {
            String storeProcedure = "sp_FormasDePagamento_Inserir";

            MySqlParameter[] parametros = new MySqlParameter[2];

            try
            {                         
                parametros[0] = new MySqlParameter();
                parametros[0].ParameterName = @"DecriçaoIn";
                parametros[0].Value = formaPagamento.Descricao;
                parametros[0].DbType = System.Data.DbType.String;

                parametros[1] = new MySqlParameter();
                parametros[1].ParameterName = @"Result";
                parametros[1].DbType = System.Data.DbType.Int32;
                parametros[1].Direction = ParameterDirection.Output;

                return (int) dao.ExecutaFuncao(parametros, storeProcedure);

            }
            catch(Exception ex)
            {
                Auxiliar.GravaLog(ex.Message, "inserirFormaPagamento");
                throw ex;
            }
        }

        public Boolean Remover(int id)
        {
            String storeProcedure = "sp_FormaDePagamento_Delete";

            MySqlParameter[] parametros = new MySqlParameter[1];

            try
            {
                parametros[0] = new MySqlParameter();
                parametros[0].ParameterName = @"idFormaPagamento";
                parametros[0].Value = id;
                parametros[0].DbType = System.Data.DbType.Int32;

                return dao.ExecutaSql(parametros, storeProcedure);
            }
            catch (Exception ex)
            {
                Auxiliar.GravaLog(ex.Message, "Remover Forma de Pagamento - Repositorio");
                throw ex;
            }
        }

        public Boolean Editar(FormaPagamento formaPagamento)
        {
            MySqlParameter[] parametros = new MySqlParameter[2];
            String storeProcedure = "sp_FormaDePagamento_Edit";

            try
            {
                parametros[0] = new MySqlParameter();
                parametros[0].ParameterName = @"idIn";
                parametros[0].Value = formaPagamento.Id;
                parametros[0].DbType = DbType.Int32;

                parametros[1] = new MySqlParameter();
                parametros[1].ParameterName = @"descricaoIn";
                parametros[1].Value = formaPagamento.Descricao;
                parametros[1].DbType = DbType.String;

                return dao.ExecutaSql(parametros, storeProcedure);

            }
            catch (Exception ex)
            {
                Auxiliar.GravaLog(ex.Message, "editarFormaPagamento - repositorio");
                throw ex;
            }
            finally
            {
                dao.FecharConexao();
            }
        }

        public FormaPagamento ConsultarFormaPagamentoPorId(int id)
        {
            String storeProcedure = "sp_FormaPagamento_Select_Id";

            MySqlDataReader dr = null;

            MySqlParameter[] parametros = new MySqlParameter[1];

            parametros[0] = new MySqlParameter();
            parametros[0].ParameterName = @"id";
            parametros[0].Value = id;
            parametros[0].DbType = System.Data.DbType.Int32;

            FormaPagamento formaPagamento = null;

            try
            {
                dr = dao.ExecutaLeituraProcedure(parametros, storeProcedure);

                String descricao = "";
                if (dr.Read())
                {
                    descricao = dr.GetString("Descricao");
                }
                formaPagamento = new FormaPagamento(id, descricao);

                return formaPagamento;
            }
            catch (Exception ex)
            {
                Auxiliar.GravaLog(ex.Message, "ConsultarFormaPagamentoPorID - Repositório");
                throw ex;
            }
            finally
            {
                if (dr != null)
                {
                    dr.Close();
                }

                dao.FecharConexao();
            }
        }

        public List<FormaPagamento> GetTodasFormasPagamento()
        {
            List<FormaPagamento> retorno = new List<FormaPagamento>();
            String storeProcedure = "sp_FormaDePagamento_Select_All";
            MySqlDataReader dr = null;

            try
            {
                dr = dao.ExecutaLeituraProcedure(storeProcedure);

                while (dr.Read())
                {
                    retorno.Add(CarregarFormaPagamento(dr));
                }
                
                return retorno;
            }
            catch (Exception ex)
            {
                Auxiliar.GravaLog(ex.Message, "GetTodasFormasPagamento - Repositorio");
                throw ex;
            }
            finally
            {
                if (dr != null)
                {
                    dr.Close();
                }

                dao.FecharConexao();
            }
        }

        private FormaPagamento CarregarFormaPagamento(MySqlDataReader dr)
        {
            int id = dr.GetInt32("Id");
            String descricao = dr.GetString("Descricao");

            FormaPagamento formaPagamento = new FormaPagamento(id, descricao);

            return formaPagamento;
        }
        #endregion

    }
}
